# import copy
#
# # 定义多层可变数据类型
# m = [1, 2, 3, 4]
# n = ['a', 'b', 'c']
# list1 = [m, n]
# list1_copy = copy.copy(list1)
# list1_deepcopy = copy.deepcopy(list1)
#
# # print(list1)  # [[1, 2, 3, 4], ['a', 'b', 'c']]
# # print(list1_deepcopy)  # [[1, 2, 3, 4], ['a', 'b', 'c']]
# # print(list1_copy)  # [[1, 2, 3, 4], ['a', 'b', 'c']]
#
# m.append(5)
# print(list1)  # [[1, 2, 3, 4, 5], ['a', 'b', 'c']]
# print(list1_deepcopy)  # [[1, 2, 3, 4], ['a', 'b', 'c']]
# print(list1_copy)  # [[1, 2, 3, 4, 5], ['a', 'b', 'c']]
#
# # 3072618335360 3072618335680
# # print(id(list1), id(list1_deepcopy))
# # 1306507676608 1306507580352
# # print(id(list1), id(list1_copy))
#
# print(id(list1[0]), id(list1[1])) # 1754420021376 1754420022208
# print(id(list1_copy[0]), id(list1_copy[1])) # 1754420021376 1754420022208
# print(id(list1_deepcopy[0]), id(list1_deepcopy[1])) # 1754420023232 1754420022848
#
# # 结论
# # 1-无论浅拷贝还深拷贝对不可变数据类型，都复制地址引用不会复制对象中的数据
# # 2-对浅拷贝只会拷贝可变数据类型的第一层对象中的数据，对于多层中嵌套的对象只复制其地址引用
# # 3-对深拷贝会对可变数据类型中所有对象的数据进行拷贝生成新内存地址空间
import copy

m = [1, 2, 3, 4]
n = ['a', 'b', 'c']
list1 = [12, 'a', m, n]
# # 使用浅拷贝复制对象，只会复制第一层的数据 12, 'a'，对于m和n只会复制内存地址值不会复制对象中的数据
# list1_cp = copy.copy(list1)
# # 对list1第一层增删改数据，不会影响浅拷贝的对象
# # list1.append('d')
# # print(list1_cp)  # [12, 'a', [1, 2, 3, 4], ['a', 'b', 'c']]
# # print(list1)  # [12, 'a', [1, 2, 3, 4], ['a', 'b', 'c'], 'd']
# # 对list1第二层增删改数据，会影响浅拷贝的对象
# m.append('d')
# print(list1_cp)  # [12, 'a', [1, 2, 3, 4, 'd'], ['a', 'b', 'c']]
# print(list1)  # [12, 'a', [1, 2, 3, 4, 'd'], ['a', 'b', 'c']]
# # 2299168034048 2299167937728 140708963358832 140708963358832
# print(id(list1), id(list1_cp), id(list1[0]), id(list1_cp[0]))

# 使用深拷贝复制对象，会复制每一层对象中的数据，不会复制任何一个地址值
list1_deep_cp = copy.deepcopy(list1)
# list1.append('d')
# print(list1_deep_cp)   # [12, 'a', [1, 2, 3, 4], ['a', 'b', 'c']]
# print(list1)  # [12, 'a', [1, 2, 3, 4], ['a', 'b', 'c'], 'd']

# m.append('d')
# print(list1)  # [12, 'a', [1, 2, 3, 4, 'd'], ['a', 'b', 'c']]
# print(list1_deep_cp)  # [12, 'a', [1, 2, 3, 4], ['a', 'b', 'c']]

list2 = list1
print(list2)
print(id(list1))  # 1805404736576
print(id(list2))  # 1805404736576

str1 = "hello world"
str2 = "hello world"
print(id(str1))  # 2535886599536
print(id(str2))  # 2535886599536

m1 = [1 ,2, 3, 4]
m2 = [1, 2, 3, 4]
print(id(m1))  # 1252976824192
print(id(m2))  # 1252976823808
